//
//  UserAccountViewMode.swift
//  sinaWeiBo
//
//  Created by smartlei on 15/10/17.
//  Copyright © 2015年 smartlei. All rights reserved.
//

import Foundation
// MARK - UserAccount视图模型
class UserAccountViewModel {
    
    //创建单例,如果为nil则无法获取用户的account,否则获取用户信息
    static let sharedUserAccountViewModel = UserAccountViewModel()
    
    //用户账户模型
    var account: UserAccount?
    //判断userLogon是否有效
    var userLogon: Bool {
        
        //access_token存在 且没过期
       // print("------\(account)")
        return  account?.access_token != nil && !isExpired
    }
    //返回access_token
    var access_token: String? {
        
        if !isExpired {
            //没过期返回access_token
            return account?.access_token
        }
        //过期返回nil
        return nil
    }
    var avatarURL: NSURL? {
        
        return NSURL(string: account?.avatar_large ?? "")
    }

    
    //从沙河创建用户信息存储路径
   private var accountPath: String? {
        //1 取沙河路径
        var path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
        //2 追加路径
        path = (path as NSString).stringByAppendingPathComponent("userAccount.plist")
        return path
    }
    
    //构造函数从沙河取信息
    init() {
        //1 从沙河用户路径中解档
         account = NSKeyedUnarchiver.unarchiveObjectWithFile(accountPath!) as? UserAccount
        
        if isExpired {
            //过期了
            account = nil
        }
    }
    // 判断用户账户过期日期与当前系统日期`进行比较`
    // 自己改写日期，测试逻辑是否正确，创建日期的时候，如果给定 负数，返回比当前时间早的日期
    private var isExpired: Bool {
        
        if account?.expires_date?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            //升序 说明没过期
            return false
        }
        //过期
        return true
    }
}
// MARK - 根据code 从网络上获取用户信息，只返回根据该code确定该用户账号能否使用不
extension UserAccountViewModel {
    //MARK - 根据code获取令牌
    func loadAccessToken(code: String,finished:(isSuccess: Bool) -> ()){
        //请求令牌
        NetworkTools.sharedTools.loadAccessToken(code) { (result, error) -> () in
            //出错显示出错信息
            if error != nil {
                //返回失败
                finished(isSuccess: false)
                print("loadAccessToken 获取令牌出错了,错误\n:\(error)")
                return
            }
            self.account = UserAccount.init(dict: (result as? [String: AnyObject])!)
            
            //MARK - 根据返回的令牌信息获取用户信息:闭包调用函数需要添加self
            self.loadUserInfo(self.account!, finished: finished)
        }
    }
    
    //MARK - 根据返回的令牌信息获取用户信息
    private func loadUserInfo(account: UserAccount,finished:(isSuccess: Bool) -> ()) {
        
        NetworkTools.sharedTools.loadUserInfo(account.uid!, access_token: account.access_token!) { (result, error) -> () in
            if error != nil {
                finished(isSuccess: false)
                print("通过用户令牌请求用户信息-出错 \(error)")
                return
            }
            
            guard let dict = result as? [String: AnyObject] else {
                finished(isSuccess: false)
                print("通过用户令牌返回的用户信息-出错 \(result)")
                return
            }
           // print(dict)
            
            //保存用户信息:字典中没有该属性则会追加
            //由于传入的是一个指针所以可以在原有基础上继续往对象上添加属性值
            account.avatar_large = dict["avatar_large"] as? String
            //print(account.avatar_hd)
            account.screen_name = dict["screen_name"] as? String
            
            //实例对象调用函数
           // account.saveUserAccount()
            NSKeyedArchiver.archiveRootObject(account, toFile: self.accountPath!)
            //最后返回成功
            finished(isSuccess: true)
        }
    }
}